home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Datatypes / RGFX-DT / Source / dt2rgfx.c < prev    next >
C/C++ Source or Header  |  1999-11-14  |  8KB  |  317 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/cybergraphics_lib.h>
  3. #include <pragma/datatypes_lib.h>
  4. #include <pragma/dos_lib.h>
  5. #include <pragma/exec_lib.h>
  6. #include <pragma/graphics_lib.h>
  7. #include <pragma/iffparse_lib.h>
  8. #include <pragma/xpkmaster_lib.h>
  9. #include <datatypes/pictureclass.h>
  10. #include <exec/memory.h>
  11. #include <libraries/rgfx.h>
  12. #include <stdlib.h>
  13.  
  14. static char ver[]="$VER:DT2RGFX 43.11 (08.10.99) © 1997-99 by Achim Stegemann\n";
  15.  
  16. static char *ifferrmsg[]=
  17. {
  18. 0,
  19. 0,
  20. 0,
  21. "No valid scope for property",
  22. "Internal memory alloc failed",
  23. "Stream read error",
  24. "Stream write error",
  25. "Stream seek error",
  26. "Data in file is corrupt",
  27. "IFF syntax error",
  28. "Not an IFF file",
  29. "No call-back hook provided"
  30. };
  31.  
  32. static long ifferr,xpkerr,memerr,xpkmode=100;
  33.  
  34. static char xpkerrmsg[XPKERRMSGSIZE];
  35.  
  36. struct
  37. {
  38. char *from;
  39. char *to;
  40. char *xpk;
  41. long *xpkmode;
  42. char *password;
  43. long verbose;
  44. } args;
  45.  
  46. Library *CyberGfxBase,*XpkBase;
  47.  
  48. static void Ende()
  49. {
  50. CloseLibrary(CyberGfxBase);
  51. CloseLibrary(XpkBase);
  52. }
  53.  
  54. static void Init()
  55. {
  56. CyberGfxBase=OpenLibrary("cybergraphics.library",40);
  57. if(!(XpkBase=OpenLibrary("xpkmaster.library",5)))
  58.     {
  59.     PutStr("DT2RGFX requires xpkmaster.library V5 or better\n");
  60.     exit(20);
  61.     }
  62. }
  63.  
  64. static BOOL PutRGHD(IFFHandle *iff,RGHD *rh)
  65. {
  66. BOOL ret=0;
  67. if(!(ifferr=PushChunk(iff,0,ID_RGHD,sizeof(RGHD))))
  68.     {
  69.     if((ifferr=WriteChunkRecords(iff,rh,sizeof(RGHD),1))==1)
  70.         {
  71.         if(!(ifferr=PopChunk(iff))) ret=1;
  72.         }
  73.     }
  74. return ret;
  75. }
  76.  
  77. static BOOL PutRCOL(Object *obj,IFFHandle *iff)
  78. {
  79. BOOL ret=0;
  80. if(!(ifferr=PushChunk(iff,0,ID_RCOL,sizeof(RCOL))))
  81.     {
  82.     RCOL *rc;
  83.     if(rc=(RCOL *)AllocVec(sizeof(RCOL),MEMF_CLEAR))
  84.         {
  85.         ULONG i,n,*cr;
  86.         GetDTAttrs(obj,PDTA_NumColors,&n,PDTA_CRegs,&cr,TAG_END);
  87.         for(i=0;i<n;i++)
  88.             {
  89.             UWORD j;
  90.             for(j=0;j<3;j++) rc->rcol_Colors[i][j]=*(cr++)>>24;
  91.             }
  92.         if((ifferr=WriteChunkRecords(iff,rc,sizeof(RCOL),1))==1)
  93.             {
  94.             if(!(ifferr=PopChunk(iff))) ret=1;
  95.             }
  96.         FreeVec(rc);
  97.         }
  98.     else memerr=1;
  99.     }
  100. return ret;
  101. }
  102.  
  103. static BOOL PutRSCM(Object *obj,IFFHandle *iff,RGHD *rh)
  104. {
  105. BOOL ret=0;
  106. if(!(ifferr=PushChunk(iff,0,ID_RSCM,sizeof(RSCM))))
  107.     {
  108.     ULONG mode;
  109.     RSCM rs={INVALID_ID,INVALID_ID,INVALID_ID};
  110.     GetDTAttrs(obj,PDTA_ModeID,&mode,TAG_END);
  111.     if(CyberGfxBase&&IsCyberModeID(mode))
  112.         {
  113.         rs.rscm_CGfx=mode;
  114.         if(rh->rgfx_Depth<=8) rs.rscm_AGA=BestModeID(
  115.         BIDTAG_NominalWidth,rh->rgfx_PageWidth,BIDTAG_NominalHeight,rh->rgfx_PageHeight,
  116.         BIDTAG_DesiredWidth,rh->rgfx_Width,BIDTAG_DesiredHeight,rh->rgfx_Height,
  117.         BIDTAG_Depth,rh->rgfx_Depth,BIDTAG_MonitorID,DEFAULT_MONITOR_ID,
  118.       BIDTAG_DIPFMustNotHave,DIPF_IS_DUALPF|DIPF_IS_PF2PRI|DIPF_IS_HAM|DIPF_IS_EXTRAHALFBRITE,TAG_END);
  119.         }
  120.     else
  121.         {
  122.         rs.rscm_AGA=mode;
  123.         if(!(mode&(HAM_KEY|EXTRAHALFBRITE_KEY|LORESDPF_KEY)))
  124.             {
  125.             if(CyberGfxBase) rs.rscm_CGfx=BestCModeIDTags(CYBRBIDTG_NominalWidth,rh->rgfx_Width,CYBRBIDTG_NominalHeight,rh->rgfx_Height,CYBRBIDTG_Depth,rh->rgfx_Depth,TAG_END);
  126.             }
  127.         }
  128.     if((ifferr=WriteChunkRecords(iff,&rs,sizeof(RSCM),1))==1)
  129.         {
  130.         if(!(ifferr=PopChunk(iff))) ret=1;
  131.         }
  132.     }
  133. return ret;
  134. }
  135.  
  136. static BOOL WriteChunky_XPK(Object *obj,IFFHandle *iff,RGHD *rh,BitMap *bm)
  137. {
  138. BOOL ret=0;
  139. ULONG len=rh->rgfx_Width*rh->rgfx_Height;
  140. UBYTE *mem;
  141. if(mem=(UBYTE *)AllocVec(len,0))
  142.     {
  143.     UBYTE *pix;
  144.     if(pix=(UBYTE *)AllocVec(((rh->rgfx_Width+16)>>4)<<4,0))
  145.         {
  146.         BitMap *tbm;
  147.         if(tbm=AllocBitMap(rh->rgfx_Width,1,rh->rgfx_Depth,0,bm))
  148.             {
  149.             ULONG y,xpklen,outlen;
  150.             UBYTE *xpk=mem;
  151.             RastPort rp,trp;
  152.             InitRastPort(&rp);
  153.             InitRastPort(&trp);
  154.             rp.BitMap=bm;
  155.             trp.BitMap=tbm;
  156.             for(y=0;y<rh->rgfx_Height;y++,xpk+=rh->rgfx_Width)
  157.                 {
  158.                 ReadPixelLine8(&rp,0,y,rh->rgfx_Width,pix,&trp);
  159.                 CopyMem(pix,xpk,rh->rgfx_Width);
  160.                 }
  161.             if(!(xpkerr=XpkPackTags(XPK_InBuf,mem,XPK_InLen,len,XPK_GetOutBuf,&xpk,XPK_GetOutBufLen,&xpklen,XPK_GetOutLen,&outlen,XPK_PackMethod,args.xpk,XPK_PackMode,xpkmode,XPK_Password,args.password,XPK_GetError,xpkerrmsg,TAG_END)))
  162.                 {
  163.                 if((ifferr=WriteChunkRecords(iff,xpk,outlen,1))==1) ret=1;
  164.                 FreeMem(xpk,xpklen);
  165.                 }
  166.             FreeBitMap(tbm);
  167.             }
  168.         else memerr=1;
  169.         FreeVec(pix);
  170.         }
  171.     else memerr=1;
  172.     FreeVec(mem);
  173.     }
  174. else memerr=1;
  175. return ret;
  176. }
  177.  
  178. static BOOL Write24_XPK(Object *obj,IFFHandle *iff,RGHD *rh)
  179. {
  180. BOOL ret=0;
  181. UBYTE *pix;
  182. ULONG len=rh->rgfx_BytesPerLine*rh->rgfx_Height;
  183. if(pix=(UBYTE *)AllocVec(len,0))
  184.     {
  185.     ULONG xpklen,outlen;
  186.     UBYTE *xpk;
  187.     DoMethod(obj,PDTM_READPIXELARRAY,pix,RECTFMT_RGB,rh->rgfx_BytesPerLine,0,0,rh->rgfx_Width,rh->rgfx_Height);
  188.     if(!(xpkerr=XpkPackTags(XPK_InBuf,pix,XPK_InLen,len,XPK_GetOutBuf,&xpk,XPK_GetOutBufLen,&xpklen,XPK_GetOutLen,&outlen,XPK_PackMethod,args.xpk,XPK_PackMode,xpkmode,XPK_Password,args.password,XPK_GetError,xpkerrmsg,TAG_END)))
  189.         {
  190.         if((ifferr=WriteChunkRecords(iff,xpk,outlen,1))==1) ret=1;
  191.         FreeMem(xpk,xpklen);
  192.         }
  193.     FreeVec(pix);
  194.     }
  195. else memerr=1;
  196. return ret;
  197. }
  198.  
  199. static BOOL PutBODY(Object *obj,IFFHandle *iff,RGHD *rh)
  200. {
  201. BOOL ret=0;
  202. if(!(ifferr=PushChunk(iff,0,ID_RBOD,IFFSIZE_UNKNOWN)))
  203.     {
  204.     BOOL wok=0;
  205.     BitMap *bm;
  206.     GetDTAttrs(obj,PDTA_BitMap,&bm,TAG_END);
  207.     if(args.verbose) PutStr("Writing IFF-RGFX file ...\n");
  208.     if(rh->rgfx_Depth>8) wok=Write24_XPK(obj,iff,rh);
  209.     else wok=WriteChunky_XPK(obj,iff,rh,bm);
  210.     if(wok)
  211.         {
  212.         if(!(ifferr=PopChunk(iff))) ret=1;
  213.         }
  214.     }
  215. return ret;
  216. }
  217.  
  218. void main()
  219. {
  220. ULONG ret=10;
  221. RDArgs *rd;
  222. atexit(Ende);
  223. Init();
  224. if(rd=ReadArgs("FROM/A,TO/A,XPK/A/K,MODE/K/N,PW=PASSWORD/K,VERBOSE/S",(long *)&args,0))
  225.     {
  226.     BOOL ok=0;
  227.     Object *obj;
  228.     if(args.verbose) Printf("Loading %s ...\n",args.from);
  229.     if(args.xpkmode)
  230.         {
  231.         xpkmode=*args.xpkmode;
  232.         if(xpkmode<0) xpkmode=0;
  233.         else if(xpkmode>100) xpkmode=100;
  234.         }
  235.     if(obj=NewDTObject(args.from,DTA_GroupID,GID_PICTURE,PDTA_Remap,0,PDTA_DestMode,PMODE_V43,TAG_END))
  236.         {
  237.         if(DoDTMethod(obj,0,0,DTM_PROCLAYOUT,0,1))
  238.             {
  239.             IFFHandle *iff;
  240.             if(iff=AllocIFF())
  241.                 {
  242.                 if(iff->iff_Stream=Open(args.to,MODE_NEWFILE))
  243.                     {
  244.                     InitIFFasDOS(iff);
  245.                     if(!(ifferr=OpenIFF(iff,IFFF_WRITE)))
  246.                         {
  247.                         if(!(ifferr=PushChunk(iff,ID_RGFX,ID_FORM,IFFSIZE_UNKNOWN)))
  248.                             {
  249.                             BitMapHeader *bh;
  250.                             RGHD rh;
  251.                             GetDTAttrs(obj,PDTA_BitMapHeader,&bh,TAG_END);
  252.                             rh.rgfx_LeftEdge=bh->bmh_Left;
  253.                             rh.rgfx_TopEdge=bh->bmh_Top;
  254.                             rh.rgfx_Width=bh->bmh_Width;
  255.                             rh.rgfx_Height=bh->bmh_Height;
  256.                             rh.rgfx_PageWidth=bh->bmh_PageWidth?bh->bmh_PageWidth:rh.rgfx_Width;
  257.                             rh.rgfx_PageHeight=bh->bmh_PageHeight?bh->bmh_PageHeight:rh.rgfx_Height;
  258.                             rh.rgfx_Depth=bh->bmh_Depth;
  259.                             if(args.verbose) Printf("Image size: %lu*%lu*%lu\n",rh.rgfx_Width,rh.rgfx_Height,rh.rgfx_Depth);
  260.                             if(rh.rgfx_Depth<=8)
  261.                                 {
  262.                                 rh.rgfx_PixelBits=8;
  263.                                 rh.rgfx_BytesPerLine=rh.rgfx_Width;
  264.                                 rh.rgfx_BitMapType=RMBT_BYTECHUNKY8;
  265.                                 if(args.verbose) Printf("Saving in Chunky mode.\n");
  266.                                 }
  267.                             else
  268.                                 {
  269.                                 rh.rgfx_PixelBits=24;
  270.                                 rh.rgfx_BytesPerLine=rh.rgfx_Width*3;
  271.                                 rh.rgfx_BitMapType=RMBT_3BYTERGB24;
  272.                                 if(args.verbose) Printf("Saving in RGB24 mode.\n");
  273.                                 }
  274.                             rh.rgfx_Compression=RCMT_XPK;
  275.                             if(args.verbose) Printf("Using Xpk packer %s.\n",args.xpk);
  276.                             rh.rgfx_XAspect=bh->bmh_XAspect;
  277.                             rh.rgfx_YAspect=bh->bmh_YAspect;
  278.                             if(PutRGHD(iff,&rh))
  279.                                 {
  280.                                 if(bh->bmh_Depth>8||PutRCOL(obj,iff))
  281.                                     {
  282.                                     if(PutRSCM(obj,iff,&rh)) ok=PutBODY(obj,iff,&rh);
  283.                                     }
  284.                                 }
  285.                             if(ok)
  286.                                 {
  287.                                 if(ifferr=PopChunk(iff)) ok=0;
  288.                                 }
  289.                             }
  290.                         CloseIFF(iff);
  291.                         }
  292.                     Close(iff->iff_Stream);
  293.                     if(ifferr<-2) Printf("IFF error: %s\n",ifferrmsg[-ifferr]);
  294.                     if(xpkerr) Printf("Xpk error: %s\n",xpkerrmsg);
  295.                     if(memerr) PutStr("Out of memory.\n");
  296.                     if(!ok) DeleteFile(args.to);
  297.                     else
  298.                         {
  299.                         if(args.verbose) PutStr("Conversion finished.\n");
  300.                         SetProtection(args.to,FIBF_EXECUTE);
  301.                         ret=0;
  302.                         }
  303.                     }
  304.                 FreeIFF(iff);
  305.                 }
  306.             else PutStr("AllocIFF failed.\n");
  307.             }
  308.         else PutStr("DTObject Layout failed.\n");
  309.         DisposeDTObject(obj);
  310.         }
  311.     else Printf("Loading of DTObject %s failed.\n",args.from);
  312.     FreeArgs(rd);
  313.     }
  314. if(IoErr()) PrintFault(IoErr(),"DOS error");
  315. exit(ret);
  316. }
  317.